--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXMF/LXMPeer.py fa9fd2ae013e39bc604d68d1e516a652b5c66916 (fa9fd2ae) Text, 31.12 KB
Tff7b72import T7ee787os
Tff7b72import T7ee787time
Tff7b72import T7ee787threading
Tff7b72import T7ee787RNS
Tff7b72import T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787umsgpack Tff7b72as T7ee787msgpack
Tff7b72import T7ee787LXMFT7ee787.T7ee787LXStamper Tff7b72as T7ee787LXStamper
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787.T7ee787LXMF Tff7b72import Te6edf3APP_NAME
Tff7b72from T7ee787.T7ee787LXMF Tff7b72import Te6edf3PN_META_NAME
Tff7b72class T56d364LXMPeerTb4b4b4:
Te6edf3OFFER_REQUEST_PATH Tff7b72= Ta5d6ff"Ta5d6ff/offerTa5d6ff"
Te6edf3MESSAGE_GET_PATH Tff7b72= Ta5d6ff"Ta5d6ff/getTa5d6ff"
Te6edf3IDLE Tff7b72= T79c0ff0x00
Te6edf3LINK_ESTABLISHING Tff7b72= T79c0ff0x01
Te6edf3LINK_READY Tff7b72= T79c0ff0x02
Te6edf3REQUEST_SENT Tff7b72= T79c0ff0x03
Te6edf3RESPONSE_RECEIVED Tff7b72= T79c0ff0x04
Te6edf3RESOURCE_TRANSFERRING Tff7b72= T79c0ff0x05
Te6edf3ERROR_NO_IDENTITY Tff7b72= T79c0ff0xf0
Te6edf3ERROR_NO_ACCESS Tff7b72= T79c0ff0xf1
Te6edf3ERROR_INVALID_KEY Tff7b72= T79c0ff0xf3
Te6edf3ERROR_INVALID_DATA Tff7b72= T79c0ff0xf4
Te6edf3ERROR_INVALID_STAMP Tff7b72= T79c0ff0xf5
Te6edf3ERROR_THROTTLED Tff7b72= T79c0ff0xf6
Te6edf3ERROR_NOT_FOUND Tff7b72= T79c0ff0xfd
Te6edf3ERROR_TIMEOUT Tff7b72= T79c0ff0xfe
Te6edf3STRATEGY_LAZY Tff7b72= T79c0ff0x01
Te6edf3STRATEGY_PERSISTENT Tff7b72= T79c0ff0x02
Te6edf3DEFAULT_SYNC_STRATEGY Tff7b72= Te6edf3STRATEGY_PERSISTENT
T8b949e# Maximum amount of time a peer can
T8b949e# be unreachable before it is removed
Te6edf3MAX_UNREACHABLE Tff7b72= T79c0ff14Tff7b72*T79c0ff24Tff7b72*T79c0ff60Tff7b72*T79c0ff60
T8b949e# Everytime consecutive time a sync
T8b949e# link fails to establish, add this
T8b949e# amount off time to wait before the
T8b949e# next sync is attempted.
Te6edf3SYNC_BACKOFF_STEP Tff7b72= T79c0ff12Tff7b72*T79c0ff60
T8b949e# How long to wait for an answer to
T8b949e# peer path requests before deferring
T8b949e# sync to later.
Te6edf3PATH_REQUEST_GRACE Tff7b72= T79c0ff7.5
Tf0883e@staticmethod
Tff7b72def Td2a8fffrom_bytesTb4b4b4(Te6edf3peer_bytesTb4b4b4, Te6edf3routerTb4b4b4)Tb4b4b4:
Te6edf3dictionary Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3peer_bytesTb4b4b4)
Te6edf3peer_destination_hash Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4]
Te6edf3peer_peering_timebase Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_timebaseTa5d6ff"Tb4b4b4]
Te6edf3peer_alive Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffaliveTa5d6ff"Tb4b4b4]
Te6edf3peer_last_heard Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4]
Te6edf3peer Tff7b72= Te6edf3LXMPeerTb4b4b4(Te6edf3routerTb4b4b4, Te6edf3peer_destination_hashTb4b4b4)
Te6edf3peerTff7b72.Td2a8ffpeering_timebase Tff7b72= Te6edf3peer_peering_timebase
Te6edf3peerTff7b72.Td2a8ffalive Tff7b72= Te6edf3peer_alive
Te6edf3peerTff7b72.Td2a8fflast_heard Tff7b72= Te6edf3peer_last_heard
Tff7b72if Ta5d6ff"Ta5d6fflink_establishment_rateTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8fflink_establishment_rate Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflink_establishment_rateTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8fflink_establishment_rate Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6ffsync_transfer_rateTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffsync_transfer_rate Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffsync_transfer_rateTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffsync_transfer_rate Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6ffpropagation_transfer_limitTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_transfer_limit Tff7b72= Tffa657floatTb4b4b4(Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_limitTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_transfer_limit Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_transfer_limit Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpropagation_sync_limitTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_sync_limit Tff7b72= Tffa657intTb4b4b4(Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_sync_limitTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_sync_limit Tff7b72= Te6edf3peerTff7b72.Td2a8ffpropagation_transfer_limit
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_sync_limit Tff7b72= Te6edf3peerTff7b72.Td2a8ffpropagation_transfer_limit
Tff7b72if Ta5d6ff"Ta5d6ffpropagation_stamp_costTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_stamp_cost Tff7b72= Tffa657intTb4b4b4(Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_costTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_stamp_cost Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_stamp_cost Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_stamp_cost_flexibility Tff7b72= Tffa657intTb4b4b4(Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_stamp_cost_flexibility Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpropagation_stamp_cost_flexibility Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffpeering_costTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpeering_cost Tff7b72= Tffa657intTb4b4b4(Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpeering_cost Tff7b72= Tff7b72None
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpeering_cost Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffsync_strategyTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4:
Tff7b72tryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffsync_strategy Tff7b72= Tffa657intTb4b4b4(Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffsync_strategyTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72exceptTb4b4b4: Te6edf3peerTff7b72.Td2a8ffsync_strategy Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffDEFAULT_SYNC_STRATEGY
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffsync_strategy Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffDEFAULT_SYNC_STRATEGY
Tff7b72if Ta5d6ff"Ta5d6ffofferedTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffoffered Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffofferedTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffoffered Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6ffoutgoingTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffoutgoing Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffoutgoingTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffoutgoing Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6ffincomingTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffincoming Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffincomingTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffincoming Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffrx_bytes Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffrx_bytes Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6fftx_bytesTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8fftx_bytes Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8fftx_bytes Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6fflast_sync_attemptTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8fflast_sync_attempt Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflast_sync_attemptTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8fflast_sync_attempt Tff7b72= T79c0ff0
Tff7b72if Ta5d6ff"Ta5d6ffpeering_keyTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpeering_key Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_keyTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffpeering_key Tff7b72= Tff7b72None
Tff7b72if Ta5d6ff"Ta5d6ffmetadataTa5d6ff" Tff7b72in Te6edf3dictionaryTb4b4b4: Te6edf3peerTff7b72.Td2a8ffmetadata Tff7b72= Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffmetadataTa5d6ff"Tb4b4b4]
Tff7b72elseTb4b4b4: Te6edf3peerTff7b72.Td2a8ffmetadata Tff7b72= Tff7b72None
Te6edf3hm_count Tff7b72= T79c0ff0
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffhandled_idsTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Te6edf3routerTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Te6edf3peerTff7b72.Td2a8ffadd_handled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3hm_count Tff7b72+Tff7b72= T79c0ff1
Te6edf3um_count Tff7b72= T79c0ff0
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffunhandled_idsTa5d6ff"Tb4b4b4]Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Te6edf3routerTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Te6edf3peerTff7b72.Td2a8ffadd_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3um_count Tff7b72+Tff7b72= T79c0ff1
Te6edf3peerTff7b72.Td2a8ff_hm_count Tff7b72= Te6edf3hm_count
Te6edf3peerTff7b72.Td2a8ff_um_count Tff7b72= Te6edf3um_count
Te6edf3peerTff7b72.Td2a8ff_hm_counts_synced Tff7b72= Tff7b72True
Te6edf3peerTff7b72.Td2a8ff_um_counts_synced Tff7b72= Tff7b72True
Tff7b72del Te6edf3dictionary
Tff7b72return Te6edf3peer
Tff7b72def Td2a8ffto_bytesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3dictionary Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_timebaseTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_timebase
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffaliveTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffalive
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffmetadataTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffmetadata
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflast_heardTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_heard
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffsync_strategyTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsync_strategy
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_keyTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_key
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffdestination_hash
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflink_establishment_rateTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8fflink_establishment_rate
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffsync_transfer_rateTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffsync_transfer_rate
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_transfer_limitTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_limit
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_sync_limitTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_sync_limit
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_costTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_cost
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpropagation_stamp_cost_flexibilityTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_cost_flexibility
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffpeering_costTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_cost
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fflast_sync_attemptTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8fflast_sync_attempt
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffofferedTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffoffered
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffoutgoingTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffoutgoing
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffincomingTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffincoming
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffrx_bytesTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8ffrx_bytes
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6fftx_bytesTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72selfTff7b72.Td2a8fftx_bytes
Te6edf3handled_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffhandled_messagesTb4b4b4:
Te6edf3handled_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3unhandled_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
Te6edf3unhandled_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffhandled_idsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3handled_ids
Te6edf3dictionaryTb4b4b4[Ta5d6ff"Ta5d6ffunhandled_idsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3unhandled_ids
Te6edf3peer_bytes Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3dictionaryTb4b4b4)
Tff7b72del Te6edf3dictionary
Tff7b72return Te6edf3peer_bytes
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3routerTb4b4b4, Te6edf3destination_hashTb4b4b4, Te6edf3sync_strategyTff7b72=Te6edf3DEFAULT_SYNC_STRATEGYTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffalive Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflast_heard Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffsync_strategy Tff7b72= Te6edf3sync_strategy
Tff7b72selfTff7b72.Td2a8ffpeering_key Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpeering_cost Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffmetadata Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnext_sync_attempt Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fflast_sync_attempt Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffsync_backoff Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffpeering_timebase Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8fflink_establishment_rate Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffsync_transfer_rate Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_limit Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_sync_limit Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_cost Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_cost_flexibility Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messages Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffhandled_messages_queue Tff7b72= Te6edf3dequeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffunhandled_messages_queue Tff7b72= Te6edf3dequeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoffered Tff7b72= T79c0ff0 T8b949e# Messages offered to this peer
Tff7b72selfTff7b72.Td2a8ffoutgoing Tff7b72= T79c0ff0 T8b949e# Messages transferred to this peer
Tff7b72selfTff7b72.Td2a8ffincoming Tff7b72= T79c0ff0 T8b949e# Messages received from this peer
Tff7b72selfTff7b72.Td2a8ffrx_bytes Tff7b72= T79c0ff0 T8b949e# Bytes received from this peer
Tff7b72selfTff7b72.Td2a8fftx_bytes Tff7b72= T79c0ff0 T8b949e# Bytes sent to this peer
Tff7b72selfTff7b72.Td2a8ff_hm_count Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_um_count Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ff_hm_counts_synced Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_um_counts_synced Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_peering_key_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72selfTff7b72.Td2a8fflast_offer Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffrouter Tff7b72= Te6edf3router
Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72= Te6edf3destination_hash
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Tff7b72None
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not recall identity for LXMF propagation peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff, will retry identity resolution on next syncTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72def Td2a8ffpeering_key_readyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffpeering_costTb4b4b4: Tff7b72return Tff7b72False
Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeering_keyTb4b4b4) Tff7b72== Tffa657list Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeering_keyTb4b4b4) Tff7b72== T79c0ff2Tb4b4b4:
Te6edf3value Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_keyTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3value Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_costTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeering key value mismatch for Tffd700{Tff7b72selfTffd700}Ta5d6ff. Current value is Tffd700{Te6edf3valueTffd700}Ta5d6ff, but peer requires Tffd700{Tff7b72selfTff7b72.Td2a8ffpeering_costTffd700}Ta5d6ff. Scheduling regeneration...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpeering_key Tff7b72= Tff7b72None
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffpeering_key_valueTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeering_keyTb4b4b4) Tff7b72== Tffa657list Tff7b72and Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeering_keyTb4b4b4) Tff7b72== T79c0ff2Tb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffpeering_keyTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72elseTb4b4b4: Tff7b72return Tff7b72None
Tff7b72def Td2a8ffgenerate_peering_keyTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpeering_cost Tff7b72== Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72False
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_peering_key_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpeering_key Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72return Tff7b72True
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffGenerating peering key for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffidentity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not update peering key for Tffd700{Tff7b72selfTffd700}Ta5d6ff since the local LXMF router identity is not configuredTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not update peering key for Tffd700{Tff7b72selfTffd700}Ta5d6ff since its identity could not be recalledTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return Tff7b72False
Te6edf3key_material Tff7b72= Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTff7b72+Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhash
Te6edf3peering_keyTb4b4b4, Te6edf3value Tff7b72= Te6edf3LXStamperTff7b72.Td2a8ffgenerate_stampTb4b4b4(Te6edf3key_materialTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpeering_costTb4b4b4, Te6edf3expand_roundsTff7b72=Te6edf3LXStamperTff7b72.Td2a8ffWORKBLOCK_EXPAND_ROUNDS_PEERINGTb4b4b4)
Tff7b72if Te6edf3value Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_costTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeering_key Tff7b72= Tb4b4b4[Te6edf3peering_keyTb4b4b4, Te6edf3valueTb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeering key successfully generated for Tffd700{Tff7b72selfTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_NOTICETb4b4b4)
Tff7b72return Tff7b72True
Tff7b72return Tff7b72False
Tff7b72def Td2a8ffsyncTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffInitiating LXMF Propagation Node sync with peer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_sync_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3sync_time_reached Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffnext_sync_attempt
Te6edf3stamp_costs_known Tff7b72= Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_cost Tff7b72!= Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_cost_flexibility Tff7b72!= Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffpeering_cost Tff7b72!= Tff7b72None
Te6edf3peering_key_ready Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeering_key_readyTb4b4b4(Tb4b4b4)
Te6edf3sync_checks Tff7b72= Te6edf3sync_time_reached Tff7b72and Te6edf3stamp_costs_known Tff7b72and Te6edf3peering_key_ready
Tff7b72if Tff7b72not Te6edf3sync_checksTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Te6edf3sync_time_reachedTb4b4b4:
Te6edf3postpone_reason Tff7b72= Ta5d6ff"Ta5d6ff due to previous failuresTa5d6ff"
Tff7b72if Tff7b72selfTff7b72.Td2a8fflast_sync_attempt Tff7b72> Tff7b72selfTff7b72.Td2a8fflast_heardTb4b4b4: Tff7b72selfTff7b72.Td2a8ffalive Tff7b72= Tff7b72False
Tff7b72elif Tff7b72not Te6edf3stamp_costs_knownTb4b4b4:
Te6edf3postpone_reason Tff7b72= Ta5d6ff"Ta5d6ff since its required stamp costs are not yet knownTa5d6ff"
Tff7b72elif Tff7b72not Te6edf3peering_key_readyTb4b4b4:
Te6edf3postpone_reason Tff7b72= Ta5d6ff"Ta5d6ff since a peering key has not been generated yetTa5d6ff"
Tff7b72def Td2a8ffjobTb4b4b4(Tb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffgenerate_peering_keyTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3jobTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Te6edf3delay Tff7b72= Tff7b72selfTff7b72.Td2a8ffnext_sync_attemptTff7b72-Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3postpone_delay Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3delayTb4b4b4)Tffd700}Ta5d6ff" Tff7b72if Te6edf3delay Tff7b72> T79c0ff0 Tff7b72else Ta5d6ff"Ta5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPostponing sync with peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Tffd700{Te6edf3postpone_delayTffd700}Tffd700{Te6edf3postpone_reasonTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffNo path to peer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff exists, requesting...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3LXMPeerTff7b72.Td2a8ffPATH_REQUEST_GRACETb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffPath request was not answered, retrying sync with peer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff laterTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrecallTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffOUTTb4b4b4, Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4, Te6edf3APP_NAMETb4b4b4, Ta5d6ff"Ta5d6ffpropagationTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSync requested for Tffd700{Tff7b72selfTffd700}Ta5d6ff, but no unhandled messages exist for peer. Sync complete.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72return
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messages Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSync requested for Tffd700{Tff7b72selfTffd700}Ta5d6ff, but current message transfer index was not clear. Aborting.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffIDLETb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffEstablishing link for sync to peer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsync_backoff Tff7b72+Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffSYNC_BACKOFF_STEP
Tff7b72selfTff7b72.Td2a8ffnext_sync_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72+ Tff7b72selfTff7b72.Td2a8ffsync_backoff
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4, Te6edf3established_callback Tff7b72= Tff7b72selfTff7b72.Td2a8fflink_establishedTb4b4b4, Te6edf3closed_callback Tff7b72= Tff7b72selfTff7b72.Td2a8fflink_closedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffLINK_ESTABLISHING
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffstate Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffLINK_READYTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffalive Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fflast_heard Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsync_backoff Tff7b72= T79c0ff0
Te6edf3min_accepted_cost Tff7b72= Tffa657minTb4b4b4(T79c0ff0Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_costTff7b72-Tff7b72selfTff7b72.Td2a8ffpropagation_stamp_cost_flexibilityTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffSynchronisation link to peer Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff established, preparing sync offer...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3unhandled_entries Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3unhandled_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3purged_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3low_value_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffget_stamp_valueTb4b4b4(Te6edf3transient_idTb4b4b4) Tff7b72< Te6edf3min_accepted_costTb4b4b4: Te6edf3low_value_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3unhandled_entry Tff7b72= Tb4b4b4[ Te6edf3transient_idTb4b4b4,
Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffget_weightTb4b4b4(Te6edf3transient_idTb4b4b4)Tb4b4b4,
Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffget_sizeTb4b4b4(Te6edf3transient_idTb4b4b4) Tb4b4b4]
Te6edf3unhandled_entriesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3unhandled_entryTb4b4b4)
Tff7b72elseTb4b4b4: Te6edf3purged_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3purged_idsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDropping unhandled message Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tffd700}Ta5d6ff for peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff since it no longer exists in the message store.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremove_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3low_value_idsTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffDropping unhandled message Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3transient_idTb4b4b4)Tffd700}Ta5d6ff for peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff since its stamp value is lower than peer requirement of Tffd700{Te6edf3min_accepted_costTffd700}Ta5d6ff.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremove_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3unhandled_entriesTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3eTb4b4b4: Te6edf3eTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3reverseTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3per_message_overhead Tff7b72= T79c0ff16 T8b949e# Really only 2 bytes, but set a bit higher for now
Te6edf3cumulative_size Tff7b72= T79c0ff24 T8b949e# Initialised to highest reasonable binary structure overhead
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSyncing to peer with per-message limit Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_limitTff7b72*T79c0ff1000Tb4b4b4)Tffd700}Ta5d6ff and sync limit Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_sync_limitTff7b72*T79c0ff1000Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4) T8b949e# TODO: Remove debug
Tff7b72for Te6edf3unhandled_entry Tff7b72in Te6edf3unhandled_entriesTb4b4b4:
Te6edf3transient_id Tff7b72= Te6edf3unhandled_entryTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3weight Tff7b72= Te6edf3unhandled_entryTb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3lxm_size Tff7b72= Te6edf3unhandled_entryTb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3lxm_transfer_size Tff7b72= Te6edf3lxm_sizeTff7b72+Te6edf3per_message_overhead
Te6edf3next_size Tff7b72= Te6edf3cumulative_size Tff7b72+ Te6edf3lxm_transfer_size
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_limit Tff7b72!= Tff7b72None Tff7b72and Te6edf3lxm_transfer_size Tff7b72> Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_transfer_limitTff7b72*T79c0ff1000Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffremove_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadd_handled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72continue
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpropagation_sync_limit Tff7b72!= Tff7b72None Tff7b72and Te6edf3next_size Tff7b72>Tff7b72= Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffpropagation_sync_limitTff7b72*T79c0ff1000Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3cumulative_size Tff7b72+Tff7b72= Te6edf3lxm_transfer_size
Te6edf3unhandled_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Te6edf3offer Tff7b72= Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffpeering_keyTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3unhandled_idsTb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffOffering Tffd700{Tffa657lenTb4b4b4(Te6edf3unhandled_idsTb4b4b4)Tffd700}Ta5d6ff messages to peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhashTb4b4b4)Tffd700}Ta5d6ff (Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Tffa657lenTb4b4b4(Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3unhandled_idsTb4b4b4)Tb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff)Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_offer Tff7b72= Te6edf3unhandled_ids
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffrequestTb4b4b4(Te6edf3LXMPeerTff7b72.Td2a8ffOFFER_REQUEST_PATHTb4b4b4, Te6edf3offerTb4b4b4, Te6edf3response_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffoffer_responseTb4b4b4, Te6edf3failed_callbackTff7b72=Tff7b72selfTff7b72.Td2a8ffrequest_failedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffREQUEST_SENT
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not request sync to peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff since its identity could not be recalled.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72def Td2a8ffrequest_failedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSync request to peer Tffd700{Tff7b72selfTff7b72.Td2a8ffdestinationTffd700}Ta5d6ff failedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72def Td2a8ffoffer_responseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3request_receiptTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffRESPONSE_RECEIVED
Te6edf3response Tff7b72= Te6edf3request_receiptTff7b72.Td2a8ffresponse
Te6edf3wanted_messages Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3wanted_message_ids Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3response Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffERROR_NO_IDENTITYTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemote peer indicated that no identification was received, retrying...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffidentifyTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffLINK_READY
Tff7b72selfTff7b72.Td2a8ffsyncTb4b4b4(Tb4b4b4)
Tff7b72return
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffERROR_NO_ACCESSTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffRemote indicated that access was denied, breaking peeringTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffunpeerTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72return
Tff7b72elif Te6edf3response Tff7b72== Te6edf3LXMPeerTff7b72.Td2a8ffERROR_THROTTLEDTb4b4b4:
Te6edf3throttle_time Tff7b72= Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffPN_STAMP_THROTTLE
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRemote indicated that weTa5d6ff'Ta5d6ffre throttled, postponing sync for Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettytimeTb4b4b4(Te6edf3throttle_timeTb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnext_sync_attempt Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3throttle_time
Tff7b72return
Tff7b72elif Te6edf3response Tff7b72== Tff7b72FalseTb4b4b4:
T8b949e# Peer already has all advertised messages
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8fflast_offerTb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadd_handled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremove_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72elif Te6edf3response Tff7b72== Tff7b72TrueTb4b4b4:
T8b949e# Peer wants all advertised messages
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8fflast_offerTb4b4b4:
Te6edf3wanted_messagesTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4)
Te6edf3wanted_message_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Peer wants some advertised messages
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8fflast_offerTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# If the peer did not want the message, it has
T8b949e# already received it from another peer.
Tff7b72if Tff7b72not Te6edf3transient_id Tff7b72in Te6edf3responseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadd_handled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremove_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72for Te6edf3transient_id Tff7b72in Te6edf3responseTb4b4b4:
Te6edf3wanted_messagesTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4)
Te6edf3wanted_message_idsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3wanted_messagesTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff wanted Tffd700{Tffa657strTb4b4b4(Tffa657lenTb4b4b4(Te6edf3wanted_messagesTb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff of the available messagesTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3lxm_list Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3message_entry Tff7b72in Te6edf3wanted_messagesTb4b4b4:
Te6edf3file_path Tff7b72= Te6edf3message_entryTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3file_pathTb4b4b4)Tb4b4b4:
Te6edf3file Tff7b72= Tffa657openTb4b4b4(Te6edf3file_pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4)
Te6edf3lxmf_data Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
Te6edf3fileTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Te6edf3lxm_listTff7b72.Td2a8ffappendTb4b4b4(Te6edf3lxmf_dataTb4b4b4)
Te6edf3data Tff7b72= Te6edf3msgpackTff7b72.Td2a8ffpackbTb4b4b4(Tb4b4b4[Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3lxm_listTb4b4b4]Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffTotal transfer size for this sync is Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettysizeTb4b4b4(Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)Tb4b4b4)Tffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Te6edf3resource Tff7b72= Te6edf3RNSTff7b72.Td2a8ffResourceTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTff7b72.Td2a8fflinkTb4b4b4, Te6edf3callback Tff7b72= Tff7b72selfTff7b72.Td2a8ffresource_concludedTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messages Tff7b72= Te6edf3wanted_message_ids
Tff7b72selfTff7b72.Td2a8ffcurrent_sync_transfer_started Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffRESOURCE_TRANSFERRING
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffPeer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff did not request any of the available messages, sync completedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoffered Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8fflast_offerTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffError while handling offer response from peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffThe contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72def Td2a8ffresource_concludedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3resourceTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3resourceTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffResourceTff7b72.Td2a8ffCOMPLETETb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messages Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSync transfer completed on Tffd700{Tff7b72selfTffd700}Ta5d6ff, but transferred message index was unavailable. Aborting.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72for Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadd_handled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffremove_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Te6edf3rate_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcurrent_sync_transfer_started Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffsync_transfer_rate Tff7b72= Tb4b4b4(Te6edf3resourceTff7b72.Td2a8ffget_transfer_sizeTb4b4b4(Tb4b4b4)Tff7b72*T79c0ff8Tb4b4b4)Tff7b72/Tb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Tff7b72selfTff7b72.Td2a8ffcurrent_sync_transfer_startedTb4b4b4)
Te6edf3rate_str Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff at Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyspeedTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsync_transfer_rateTb4b4b4)Tffd700}Ta5d6ff"
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSyncing Tffd700{Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messagesTb4b4b4)Tffd700}Ta5d6ff messages to peer Tffd700{Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)Tffd700}Ta5d6ff completedTffd700{Te6edf3rate_strTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffalive Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8fflast_heard Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoffered Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8fflast_offerTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutgoing Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messagesTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftx_bytes Tff7b72+Tff7b72= Te6edf3resourceTff7b72.Td2a8ffget_data_sizeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messages Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcurrent_sync_transfer_started Tff7b72= Tff7b72None
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsync_strategy Tff7b72== Tff7b72selfTff7b72.Td2a8ffSTRATEGY_PERSISTENTTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffunhandled_message_count Tff7b72> T79c0ff0Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffsyncTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffResource transfer for LXMF peer sync failed to Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8fflink Tff7b72!= Tff7b72NoneTb4b4b4: Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72selfTff7b72.Td2a8ffcurrently_transferring_messages Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffcurrent_sync_transfer_started Tff7b72= Tff7b72None
Tff7b72def Td2a8fflink_establishedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffidentifyTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffidentityTb4b4b4)
Te6edf3link_establishment_rate Tff7b72= Te6edf3linkTff7b72.Td2a8ffget_establishment_rateTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3link_establishment_rate Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink_establishment_rate Tff7b72= Te6edf3link_establishment_rate
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffLINK_READY
Tff7b72selfTff7b72.Td2a8ffnext_sync_attempt Tff7b72= T79c0ff0
Tff7b72selfTff7b72.Td2a8ffsyncTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8fflink_closedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffstate Tff7b72= Te6edf3LXMPeerTff7b72.Td2a8ffIDLE
Tff7b72def Td2a8ffqueued_itemsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandled_messages_queueTb4b4b4) Tff7b72> T79c0ff0 Tff7b72or Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messages_queueTb4b4b4) Tff7b72> T79c0ff0
Tff7b72def Td2a8ffqueue_unhandled_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffunhandled_messages_queueTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72def Td2a8ffqueue_handled_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhandled_messages_queueTff7b72.Td2a8ffappendTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72def Td2a8ffprocess_queuesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messages_queueTb4b4b4) Tff7b72> T79c0ff0 Tff7b72or Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandled_messages_queueTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3handled_messages Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandled_messages
Te6edf3unhandled_messages Tff7b72= Tff7b72selfTff7b72.Td2a8ffunhandled_messages
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhandled_messages_queueTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3transient_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandled_messages_queueTff7b72.Td2a8ffpopTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3transient_id Tff7b72in Te6edf3handled_messagesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffadd_handled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72if Te6edf3transient_id Tff7b72in Te6edf3unhandled_messagesTb4b4b4: Tff7b72selfTff7b72.Td2a8ffremove_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72while Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffunhandled_messages_queueTb4b4b4) Tff7b72> T79c0ff0Tb4b4b4:
Te6edf3transient_id Tff7b72= Tff7b72selfTff7b72.Td2a8ffunhandled_messages_queueTff7b72.Td2a8ffpopTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3transient_id Tff7b72in Te6edf3handled_messages Tff7b72and Tff7b72not Te6edf3transient_id Tff7b72in Te6edf3unhandled_messagesTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadd_unhandled_messageTb4b4b4(Te6edf3transient_idTb4b4b4)
Tff7b72del Te6edf3handled_messagesTb4b4b4, Te6edf3unhandled_messages
Tf0883e@property
Tff7b72def Td2a8ffhandled_messagesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3pes Tff7b72= Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3hm Tff7b72= Tffa657listTb4b4b4(Tffa657filterTb4b4b4(Tff7b72lambda Te6edf3tidTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3pesTb4b4b4[Te6edf3tidTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4, Te6edf3pesTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_hm_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3hmTb4b4b4)Tb4b4b4; Tff7b72del Te6edf3pes
Tff7b72selfTff7b72.Td2a8ff_hm_counts_synced Tff7b72= Tff7b72True
Tff7b72return Te6edf3hm
Tf0883e@property
Tff7b72def Td2a8ffunhandled_messagesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3pes Tff7b72= Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3um Tff7b72= Tffa657listTb4b4b4(Tffa657filterTb4b4b4(Tff7b72lambda Te6edf3tidTb4b4b4: Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72in Te6edf3pesTb4b4b4[Te6edf3tidTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4, Te6edf3pesTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_um_count Tff7b72= Tffa657lenTb4b4b4(Te6edf3umTb4b4b4)Tb4b4b4; Tff7b72del Te6edf3pes
Tff7b72selfTff7b72.Td2a8ff_um_counts_synced Tff7b72= Tff7b72True
Tff7b72return Te6edf3um
Tf0883e@property
Tff7b72def Td2a8ffhandled_message_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_hm_counts_syncedTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_update_countsTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_hm_count
Tf0883e@property
Tff7b72def Td2a8ffunhandled_message_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_um_counts_syncedTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_update_countsTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_um_count
Tf0883e@property
Tff7b72def Td2a8ffacceptance_rateTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return T79c0ff0 Tff7b72if Tff7b72selfTff7b72.Td2a8ffoffered Tff7b72== T79c0ff0 Tff7b72else Tb4b4b4(Tff7b72selfTff7b72.Td2a8ffoutgoingTff7b72/Tff7b72selfTff7b72.Td2a8ffofferedTb4b4b4)
Tff7b72def Td2a8ff_update_countsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_hm_counts_syncedTb4b4b4:
Te6edf3hm Tff7b72= Tff7b72selfTff7b72.Td2a8ffhandled_messagesTb4b4b4; Tff7b72del Te6edf3hm
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_um_counts_syncedTb4b4b4:
Te6edf3um Tff7b72= Tff7b72selfTff7b72.Td2a8ffunhandled_messagesTb4b4b4; Tff7b72del Te6edf3um
Tff7b72def Td2a8ffadd_handled_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_hm_counts_synced Tff7b72= Tff7b72False
Tff7b72def Td2a8ffadd_unhandled_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_um_count Tff7b72+Tff7b72= T79c0ff1
Tff7b72def Td2a8ffremove_handled_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tff7b72.Td2a8ffremoveTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_hm_counts_synced Tff7b72= Tff7b72False
Tff7b72def Td2a8ffremove_unhandled_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3transient_idTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3transient_id Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrouterTff7b72.Td2a8ffpropagation_entriesTb4b4b4[Te6edf3transient_idTb4b4b4]Tb4b4b4[T79c0ff5Tb4b4b4]Tff7b72.Td2a8ffremoveTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_um_counts_synced Tff7b72= Tff7b72False
Tf0883e@property
Tff7b72def Td2a8ffnameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmetadataTb4b4b4) Tff7b72!= Tffa657dictTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3PN_META_NAME Tff7b72in Tff7b72selfTff7b72.Td2a8ffmetadataTb4b4b4: Tff7b72return Tff7b72None
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4: Tff7b72return Tff7b72selfTff7b72.Td2a8ffmetadataTb4b4b4[Te6edf3PN_META_NAMETb4b4b4]Tff7b72.Td2a8ffdecodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72exceptTb4b4b4: Tff7b72return Tff7b72None
Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4: Tff7b72return Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestination_hashTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72return Ta5d6ff"Ta5d6ff<Unknown>Ta5d6ff"
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────